package chen.yi.component.operate.log.config;

import jakarta.servlet.http.HttpServletRequest;
import java.lang.invoke.*;
import java.lang.reflect.Method;

/**
 * 方法调用封装类，使用MethodHandle实现高性能反射调用
 * 采用单例模式确保线程安全
 * @author huat
 */
public final class MethodHolder {
    // 缓存方法句柄（volatile保证可见性）
    private static volatile MethodHandle methodHandle;
    // 目标实例对象（volatile保证可见性）
    private static volatile Object targetInstance;

    /**
     * 初始化方法句柄
     * @param method 目标方法对象
     * @param instance 方法所属实例
     * @throws IllegalAccessException 当方法不可访问时抛出
     */
    public static void initialize(Method method, Object instance)
            throws IllegalAccessException {
        methodHandle = MethodHandles.lookup().unreflect(method);
        targetInstance = instance;
    }

    /**
     * 执行方法调用
     * @param request HTTP请求对象
     * @return 方法执行结果
     * @throws Throwable 方法执行异常
     */
    public static Object invoke(HttpServletRequest request) throws Throwable {
        if(methodHandle == null) throw new IllegalStateException("未初始化");
        return methodHandle.invoke(targetInstance, request);
    }
}
